跳到主要内容

Go 并发执行 SQL 小工具

有时希望使用 GORM 时能并发执行 SQL,并能够回滚,这时直接使用 goroutine 开启协程有个很麻烦的问题就是如何收集到异常

所以这时可以使用 Go 自带的并发工具 errgroup.Group 它能很方便的捕获到异常。

package repo

import (
"errors"
"fmt"

"golang.org/x/sync/errgroup"
)

// concurrentExecNoErr 并发执行
func concurrentExecNoErr(fns ...func()) {
var eg errgroup.Group
for _, fn := range fns {
tfn := fn
eg.Go(func() (retErr error) {
defer func() {
if panicErr := recover(); panicErr != nil {
retErr = errors.New(fmt.Sprintf("%v", panicErr))
}
}()
tfn()
return nil
})
}
err := eg.Wait()
panicError(err)
}

func panicError(err error) {
if err != nil {
panic(err)
}
}

使用时只需在传入回调函数就行了,里面可以塞一些 SQL 操作

concurrentExecNoErr(
func() {
// do something...
},
func() {
// do something...
},
func() {
// do something...
},
func() {
// do something...
},
)